package service.majorunit;

import java.util.List;

import util.returnvo.IndexReturnVO;
import util.returnvo.InterestListReturnVO;
import util.returnvo.MajorunitReturnVO;
import util.returnvo.RankingReturnVO;
import util.returnvo.SearchListReturnVO;
import vo.MajorunitVO;

public interface MajorunitService {
	
	/**
	 * MajorunitVO를 MajorunitReturnVO로 변환
	 * @param param
	 * @return
	 */
	public MajorunitReturnVO getMajorunitReturnVO(MajorunitVO param) throws Exception;
	
	/**
	 * MajorunitVO를 MajorunitReturnVO로 변환
	 * @param param
	 * @return
	 */
	public List<MajorunitReturnVO> getMajorunitReturnVOList(List<MajorunitVO> param) throws Exception;
	
	/**
	 * 검색값으로 종합학과유닛 가져오기.
	 * 띄어쓰기가 포함된 검색값을 split이든 tokenizer든사용해서 조각 냄.
	 * split 사용해서 배열로 만들어서 dao 인자를 배열로 바꿔 사용해도 무관.
	 * univtype_no가 0일 경우에는 모두.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param search 띄어쓰기 포함 검색값
	 * @param column 정렬할 컬럼
	 * @param univtype_no 0(모두)/1(4년제)/2(2년제)
	 * @param rowPerPage 한 페이지 줄 수
	 * @param page
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitReturnVO> getSearchedUnitByWord(List<String> wordList, String column, int univtype_no, int rowPerPage, int page) throws Exception;
	
	/**
	 * 검색값으로 학과유닛 리스트와 페이징 가져오기.
	 * 검색값으로 유닛리스트를 가져온 후에 각 유닛의 no로 리뷰 수와 각 종목 평점 수(각 종목 컬럼명은 EstimateConfig에 배열로 있음)를 가져와서 SearchListReturnVO에 넣음.
	 * univtype_no은 int로 변환해서 사용, null으로 들어올 경우 0으로.
	 * page를 int로 변환해서 사용. null이 들어올 경우 1page.
	 * rowPerPage는 PageConfig에서 가져다 사용
	 * @param search 띄어쓰기가 포함된 검색값
	 * @param column 정렬할 컬럼
	 * @param univtype_no 1(4년제)/2(2년제)
	 * @param page
	 * @return 검색결과 종합된 학과유닛 리스트와 PageManager
	 */
	public SearchListReturnVO getSearchedCompUnitByWord(String search, String column, String univtype_no, String page) throws Exception;

	/**
	 * 세부계열로 종합유닛리스트 가져오기.
	 * 인자값들을합쳐서 dao 호출.
	 * univtype_no가 0일 경우에는 모두.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param subline_no 세부계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 0(모두)/1(4년제)/2(2년제)
	 * @param rowPerPage 한 페이지 줄 수
	 * @param page
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitReturnVO> getSearchedUnitBySubline(int subline_no, String column, int univtype_no, int rowPerPage, int page) throws Exception;
	
	/**
	 * 세부계열로 학과유닛리스트와 페이징 가져오기.
	 * 해당 세부계열 유닛리스트를 가져온 후에 각 유닛의 no로 리뷰 수와 각 종목 평점 수(각 종목 컬럼명은 EstimateConfig에 배열로 있음)를 가져와서 SearchListReturnVO에 넣음.
	 * column이 null이 들어올 경우 총점으로. 기본을 미리 총점으로 잡아놓자.
	 * univtype_no은 int로 변환해서 사용, null으로 들어올 경우 0으로.
	 * page를 int로 변환해서 사용. null이 들어올 경우 1page.
	 * rowPerPage는 PageConfig에서 가져다 사용.
	 * @param subline_no 세부계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 1(4년제)/2(2년제)
	 * @param page
	 * @return 검색결과 종합된 학과유닛 리스트와 PageManager
	 */
	public SearchListReturnVO getSearchedCompUnitBySubline(int subline_no, String column, String univtype_no, String page) throws Exception;

	/**
	 * 계열로 종합유닛리스트 가져오기.
	 * @param line_no 계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 0(모두)/1(4년제)/2(2년제)
	 * @param rowPerPage 한 페이지 줄 수
	 * @param page
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitReturnVO> getSearchedUnitByLine(int line_no, String column, int univtype_no, int rowPerPage, int page) throws Exception;
	
	/**
	 * 계열로 학과유닛리스트와 페이징 가져오기.
	 * @param line_no 계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 1(4년제)/2(2년제)
	 * @param page
	 * @return 검색결과 종합된 학과유닛 리스트와 PageManager
	 */
	public SearchListReturnVO getSearchedCompUnitByLine(int line_no, String column, String univtype_no, String page) throws Exception;
	
	/**
	 * 지역으로 종합유닛리스트 가져오기.
	 * 인자값들을합쳐서 dao 호출.
	 * univtype_no가 0일 경우에는 모두.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param subline_no 세부계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 0(모두)/1(4년제)/2(2년제)
	 * @param rowPerPage 한 페이지 줄 수
	 * @param page
	 * @return 검색결과 학과유닛 리스트
	 */
	public List<MajorunitReturnVO> getSearchedUnitByRegion(int region_no, String column, int univtype_no, int rowPerPage, int page) throws Exception;
	
	/**
	 * 지역으로 학과유닛리스트와 페이징 가져오기.
	 * 해당 세부계열 유닛리스트를 가져온 후에 각 유닛의 no로 리뷰 수와 각 종목 평점 수(각 종목 컬럼명은 EstimateConfig에 배열로 있음)를 가져와서 SearchListReturnVO에 넣음.
	 * column이 null이 들어올 경우 총점으로. 기본을 미리 총점으로 잡아놓자.
	 * univtype_no은 int로 변환해서 사용, null으로 들어올 경우 0으로.
	 * page를 int로 변환해서 사용. null이 들어올 경우 1page.
	 * rowPerPage는 PageConfig에서 가져다 사용.
	 * @param subline_no 세부계열no
	 * @param column 정렬할 컬럼
	 * @param univtype_no 1(4년제)/2(2년제)
	 * @param page
	 * @return 검색결과 종합된 학과유닛 리스트와 PageManager
	 */
	public SearchListReturnVO getSearchedCompUnitByRegion(int region_no, String column, String univtype_no, String page) throws Exception;
	
	/**
	 * 해당 종목의 최고 종합유닛(로고포함) 리턴.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param column 종목
	 * @return 종합유닛(유닛(로고포함)+해당 종목 평균)
	 */
	public MajorunitReturnVO getEstimateTopUnit(String column) throws Exception;
	
	/**
	 * 해당 지역의 최고 총점 평균 종합유닛(로고포함) 리턴.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param region_no 지역 no
	 * @return 종합유닛(유닛(로고포함)+총점 평균)
	 */
	public MajorunitReturnVO getRegionTopUnit(int region_no) throws Exception;
	
	/**
	 * 해당 세부계열의 최고 총점 평균 종합유닛(로고포함) 리턴.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * 나머지 각 항목은 알아서.
	 * @param subline_no 계열 no
	 * @return 종합유닛(유닛(로고포함)+총점 평균)
	 */
	public MajorunitReturnVO getLineTopUnit(int subline_no) throws Exception;
	
	/**
	 * index.jsp에서 사용할 정보 가져오기
	 * member_no가 null이면 관심학과 리뷰는 안 함.
	 * null이 아닐 경우는 int로 변환해서 사용.
	 * 종목은 EstimateConfig의 columns 배열 사용.
	 * region_no는 랜덤으로. 
	 * @param login
	 * @return
	 */
	public IndexReturnVO getIndexReturnVO(String member_no) throws Exception;
	
	
	
	/**
	 * 종합 학과유닛 가져오기
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * @param majorunit_no
	 * @return 학과유닛(로고 포함)+리뷰수+종목별평균+추천평균+남녀비율평균
	 */
	public MajorunitReturnVO getOneUnitReturn(int majorunit_no) throws Exception;
	
	/**
	 * 검색값으로 자동완성 리스트 만들기.
	 * 검색값을 띄어쓰기를 기준으로 배열이나 리스트로 쪼개 dao를 호출.
	 * 받은 리스트를 문자열리스트로 변환.
	 * MajorunitManager.convertUnitToString()이용
	 * @param search 띄어쓰기 포함 검색값
	 * @return
	 */
	public List<String> getAutoCompleteList(String search) throws Exception;

	/**
	 * 학과 유닛 하나 가져오기. 
	 * 리뷰를 작성한 적이 있나 확인해서 있으면 majorunit_no가 -1인 MajorunitReturnVO 객체를 하나 만들어 리턴.
	 * 없으면 해당 학과 유닛 리턴.
	 * MajorunitReturnVO로 변환시킬 때는 majorunit_no를 넣어주고 
	 * MajorunitManager.convertUnitToString()이용해서 majorunit_name을 넣고
	 * UnivVO안에 있는 로고를 넣어 줌.
	 * @param member_no
	 * @param majorunit_no
	 * @return
	 */
	public MajorunitReturnVO getOneUnitForReview(int member_no, int majorunit_no) throws Exception;

	/**
	 * 관심 등록한 유닛 가져오기+페이징. MajorunitReturnVo로 변환해서 넣음. 
	 * rowPerPage는 PageConfig에 있음. page는 int로 변환해서 사용. null일 경우에는 1페이지
	 * @param member_no
	 * @param page
	 * @return
	 */
	public InterestListReturnVO getInterestedUnit(int member_no, String page) throws Exception;
	
	/**
	 * rankin.jsp에서 사용할 각 종목 탑3 유닛들
	 * @return
	 */
	public RankingReturnVO getRankingReturnVO() throws Exception;

	/**
	 * 팝업 사용 검색 리스트
	 * @param search
	 * @param page
	 * @return
	 */
	public SearchListReturnVO getPopupSearchedUnit(String search, String page) throws Exception;

}
